﻿/*
 * 委托
 * 一种方法的声明和定义,也就是方法的占位符
 * 用参数传递方法
 */

#region 参数,属性

////参数,属性

//Calculator calculator = new Calculator();
//calculator.DoAdd(MakePlus);
//calculator.DoAdd((a, b) => a + b);
//calculator.DoAdd((a, b) =>
//{
//    return a + b;
//});

////委托是引用类型 是一个类
//var delegateAdd = new Calculator.Add((a, b) =>
//{
//    a += 12;
//    b -= 10;
//    return a + b;
//});
//calculator.DoAdd(delegateAdd);

//static int MakePlus(int a, int b)
//{
//    return a + b;
//}


//class Calculator
//{
//    public delegate int Add(int a, int b);

//    public int DoAdd(Add action)
//    {
//        return action(1, 2);
//    }
//}

#endregion


#region Action Func Predicate
//Action Func Predicate

var action = new Action<int, int>((a, b) =>
{
    var c = a + b;
    Console.WriteLine(c);
});
action(1, 2);

var func = new Func<int, int, int>((a, b) =>
{
    var c = a + b;
    return c;
});
var d = func(1, 2);
Console.WriteLine(d);

//Predicate 是返回一个bool的Func  Func<int> 这两个是等价的  所以说  Func<int,bool> = Predicate<int>
//Predicate 只有一个输入参数 T 泛型
var predicate = new Predicate<int>(x => x % 2 == 0);
var isOdd = new Func<int, bool>(x => x % 2 == 0); 
//上面这两个是等价的

#endregion
